%% Pegando e organizando dados
clear; clc;
udata = load("u.data");

% Isolando somente os valores que importam (coluna 1 e 2)
u = udata(1:end, 1:2);

% Fecha-se udata
clear udata;

% Obtendo usuários presentes na data e seus ID's
users = unique(u(:, 1)); % ID's
numId = length(users); % Número de users

% Lista de filmes por ID - Só espaço na memória
listFilmID = cell(numId, 1);

% Organiza filmes na lista de cada utilizador
for n = 1:numId
    idx = find((u(:,1) == users(n))); % Posição de todos os filmes que tem o mesmo ID
    listFilmID{n} = [listFilmID{n} u(idx, 2)];
end

%% Calculando distância de Jaccard
% Alocação de espaço
jaccard = zeros(numId, numId);

% Percorrendo todos os ID's, procura similaridade - Também calcula tempo;
tic
for ID1 = 1:numId
    for ID2 = ID1 + 1:numId
        inter = intersect(listFilmID{ID1}, listFilmID{ID2});
        uniao = union(listFilmID{ID1}, listFilmID{ID2});
        jaccard(ID1, ID2) = 1 - (length(inter) / length(uniao));
    end
end
toc

%% Procurando pares similares
% Limiar de proximidade
limiar = 0.4;

% Array para guardar pares similares (user1, user2, distância)
paresLimiares= zeros(1,3);
i = 1;
tic
for ID1 = 1:numId
  for ID2 = ID1 + 1:numId
    if jaccard(ID1,ID2) < limiar
      paresLimiares(i,:)= [users(ID1) users(ID2) jaccard(ID1, ID2)];
      i = i + 1;
      fprintf("Distância %f entre ID1: %d ; ID2: %d\n", jaccard(ID1,ID2), users(ID1), users(ID2));
    end
  end
end
toc